interface ModuleConfig {
  loadExternalModules: boolean;
}

class ModuleLoader {
  private config: ModuleConfig | null = null;

  private async initialize() {
    try {
      const response = await fetch('/load-modules-config.json');
      this.config = await response.json();
      console.log('模块配置:', this.config);
    } catch (error) {
      console.error('加载配置失败:', error);
      this.config = {
        loadExternalModules: false,
      };
    }
  }

  /**
   * 加载指定模块的指定插件
   * @param moduleName 模块名（如：task、login、device）
   * @param pluginName 插件名（如：advanced-task、simple-task）
   */
  async loadModule(moduleName: string, pluginName: string) {
    if (!this.config) await this.initialize();

    const isExternal = this.config!.loadExternalModules;

    try {
      if (isExternal) {
        // 开发模式：端口区分模块，所有插件都加载moduleEntry.js
        // console.log(`🔧 开发模式：${moduleName}模块(${port}端口) → 插件${pluginName}`);
        return await this.loadExternalPlugin(moduleName, pluginName);
      } else {
        // 生产模式：目录+插件名区分
        console.log(`📦 生产模式：${moduleName}模块 → 插件${pluginName}`);
        return await this.loadLocalPlugin(moduleName, pluginName);
      }
    } catch (error) {
      console.error(`加载模块 ${moduleName} 的插件 ${pluginName} 失败:`, error);
      return null;
    }
  }

  /**
   * 开发模式：通过模块联邦加载外部插件
   * 统一参数：开发模式下也使用插件名，但实际都加载entry.js
   */
  private async loadExternalPlugin(moduleName: string, pluginName: string) {

    const moduleMap = {
      'task': 'taskModule/main',
      'login': 'loginModule/main',
      'device': 'deviceModule/main',
      'test': 'testModule/main',
      'calibration': 'calibrationModule/main',
      'user': 'userModule/main'
    };
    const moduleUrl = moduleMap[moduleName as keyof typeof moduleMap];
    if (!moduleUrl) {
      throw new Error(`未知模块: ${moduleName}，未配置端口`);
    }
    console.log(`🔧 开发模式：${moduleName}模块加载插件${pluginName} → ${moduleUrl}`);
    const module = await import(/* @vite-ignore */ moduleUrl);
    return module;
  }

  /**
   * 生产模式：加载本地插件
   */
  private async loadLocalPlugin(moduleName: string, pluginName: string) {
    // 模块名到实际目录的映射
    const moduleMap = {
      'task': 'task',
      'login': 'login',
      'device': 'device',
      'test': 'test',
      'calibration': 'calibration',
      'user': 'user'
    };

    const actualModuleDir = moduleMap[moduleName as keyof typeof moduleMap];
    if (!actualModuleDir) {
      throw new Error(`未知模块: ${moduleName}`);
    }

    const basePath = '/modules';

    // 插件路径：modules/{模块目录}/{插件名}/{插件名}.js
    const pluginPath = `${basePath}/${actualModuleDir}/${pluginName}/${pluginName}.js`;
    const module = await import(/* @vite-ignore */ pluginPath);

    return module;
  }

  /**
   * 兼容旧接口：加载默认插件
   */
  // async loadModule(moduleName: string) {
  //   return this.loadPlugin(moduleName, 'default');
  // }

  getCurrentMode() {
    return this.config?.loadExternalModules ? 'external' : 'internal';
  }
}

export const moduleLoader = new ModuleLoader();